package com.elitel.frame.task;

import com.alibaba.fastjson.JSON;
import com.elitel.frame.base.service.strategy.service.BuildServiceFactory;
import com.elitel.frame.base.service.strategy.service.BuildServiceStrategy;
import com.elitel.frame.main.dao.ext.ExtSysPrjserviceMapper;
import com.elitel.frame.main.entity.ext.PrjServiceExt;
import com.elitel.frame.main.entity.vo.ServiceConfig;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 定时任务 配置服务接口配置信息
 */
@Component("syncServiceInterfaceConfigScheduler")
public class SyncServiceInterfaceConfigScheduler {
    Logger logger = LoggerFactory.getLogger(SyncServiceInterfaceConfigScheduler.class);
    @Resource
    ExtSysPrjserviceMapper extSysPrjserviceMapper;


    @Resource
    StringRedisTemplate stringRedisTemplate;


    private static String REDIS_KEY = "dscloud:config:model:";


    /**
     * 同步服务配置信息到Redis
     * 该方法负责从系统中获取所有注册的服务列表，按服务类型分组，
     * 并使用相应的策略构建服务模型，最后将模型数据写入Redis
     */
    public void syncData() {
        logger.info("开始同步服务配置信息。");

        // 获取注册服务列表
        List<PrjServiceExt> targetServices = extSysPrjserviceMapper.getList();

        if (CollectionUtils.isEmpty(targetServices)) {
            logger.info("没有需要同步的服务配置信息。");
            return;
        }

        // 将服务列表按服务类型分组
        Map<String, List<PrjServiceExt>> map = targetServices.stream()
                .filter(item -> !ObjectUtils.isEmpty(item.getServertype()))
                .collect(Collectors.groupingBy(PrjServiceExt::getServicetype));

        // 遍历每个服务类型及其对应的服务列表
        map.forEach((serviceType, prjServiceExtList) -> {
            // 根据服务类型获取构建策略
            BuildServiceStrategy buildServiceStrategy = BuildServiceFactory.getStrategyNoNull(serviceType);

            // 如果策略为空，则不进行后续处理
            if (ObjectUtils.isEmpty(buildServiceStrategy)) {
                return;
            }

            // 使用策略构建服务模型
            List<ServiceConfig> resultList = buildServiceStrategy.buildServiceModel(prjServiceExtList);

            for (ServiceConfig stringObjectMap : resultList) {
                // 将服务配置信息写入Redis
                stringRedisTemplate.opsForValue().set(
                        REDIS_KEY + stringObjectMap.getServiceId(),
                        JSON.toJSONString(stringObjectMap)
                );
            }
        });

        logger.info("结束同步服务配置信息");
    }

}
